package sample.utils;

import sample.entity.ConnectionEntity;

import java.io.InputStream;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class MysqlUtil {
    /**
     * 链接数据库
     */
    /**
     * 方法一：
     * 加载驱动的方法不止一种，但这种最常用
     */
    public static Connection getConnectionOne(String database, String username, String password) {
        System.out.println(ConnectionEntity.getConnectionEntity().getDbname());
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + database, username,
                    password);
            return connection;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static Connection getConnection() {
        ConnectionEntity connectionEntity = ConnectionEntity.getConnectionEntity();
        System.out.println(ConnectionEntity.getConnectionEntity());
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + connectionEntity.getDbname(), connectionEntity.getUsername(),
                    connectionEntity.getPassword());
            return connection;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 方法二：
     * 利用properties文件
     * ：：：：： 在Web 编程时 文件难以定位
     */
    public static Connection getConnectionTwo() {
        /**
         * 建立文件
         */
        Properties pro = new Properties();

        InputStream in = MysqlUtil.class.getClassLoader().getResourceAsStream("mysqllog.properties");
        try {
            pro.load(in);
            Class.forName(pro.getProperty("driver"));
            String username = pro.getProperty("user");
            String password = pro.getProperty("password");
            String database = pro.getProperty("database");
            String url = pro.getProperty("url");

            Connection connection = DriverManager.getConnection(url + database, username, password);
            return connection;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    // Connection ,Statement, ResultSet 这几个资源的关闭是有顺序的
    public static void close(Object... objects) {
        Map<String, Object> map = new HashMap();
        for (Object o : objects) {
            if (o instanceof ResultSet) {
                map.put("ResultSet", o);
            } else if (o instanceof Connection) {
                map.put("Connection", o);
            } else if (o instanceof Statement) {
                map.put("Statement", o);
            } else if (o instanceof PreparedStatement) {
                map.put("PreparedStatement", o);
            } else {
                // throw new MysqlCloseException("关闭异常，不能处理");
            }
        }
        Object obj = map.get("ResultSet");
        if (obj != null) {
            ResultSet r = (ResultSet) obj;
            try {
                r.close();
                map.remove("ResultSet");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        obj = map.get("PreparedStatement");
        if (obj != null) {
            PreparedStatement p = (PreparedStatement) obj;
            try {
                p.close();
                map.remove("PreparedStatement");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        obj = map.get("Statement");
        if (obj != null) {
            Statement s = (Statement) obj;
            try {
                s.close();
                map.remove("Statement");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        obj = map.get("Connection");
        if (obj != null) {
            Connection c = (Connection) obj;
            try {
                c.close();
                map.remove("Connection");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}